home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Source / MacTech® Magazine / Volume 09 - 1993 / 09.07 Jul 93 / Bedrock Header Files / Support Includes / BRVMHeap.h < prev    next >
Encoding:
Text File  |  1993-04-19  |  5.9 KB  |  215 lines  |  [TEXT/MPS ]

  1. // BRVMHeap.h 
  2. // Copyright © 1985-1992 by Apple Computer, Inc.  All rights fReserved.
  3.  
  4. #ifndef BRVMHEAP_H
  5. #define BRVMHEAP_H
  6.  
  7. #ifdef BR_BUILD_MAC
  8. #ifndef __STDDEF__
  9. #include <StdDef.h>
  10. #endif
  11.  
  12. #ifndef __TYPES__
  13. #include <Types.h>
  14. #endif
  15. #endif //BR_BUILD_MAC
  16.  
  17. #ifdef BR_BUILD_WIN
  18. #ifndef __STDDEF_H
  19. #include <StdDef.h>
  20. #endif
  21.  
  22. #ifndef __TYPES_H
  23. //#include <Types.h>
  24. #endif
  25. #endif //BR_BUILD_WIN
  26.  
  27. #ifndef BRSUPDEF_H
  28. #include "BRSupDef.h"
  29. #endif
  30.  
  31. // ToDo's
  32. // 1) Add method IsValid.
  33.  
  34. //----------------------------------------------------------------------------------------
  35. // Forward class declarations
  36. //----------------------------------------------------------------------------------------
  37.  
  38. class BR_CMemoryHookList;
  39.  
  40. #ifdef BR_BUILD_MAC
  41. typedef size_t BR_MemoryBlockSize;        //???RSS
  42. #endif
  43. #ifdef BR_BUILD_WIN
  44. typedef long int BR_MemoryBlockSize;    //???RSS
  45. #endif
  46. typedef long BR_PointerDifference;        //???RSS
  47.  
  48. //========================================================================================
  49. // BR_CMemoryHook
  50. //
  51. //        A fMemory hook that can be used to track heap operations by subclassing BR_CMemoryHook
  52. //        and overriding the methods of interest. Your subclass is then registered with a
  53. //        MemoryHeap.
  54. //
  55. //========================================================================================
  56.  
  57. class BR_CMemoryHook
  58. {
  59. public:
  60.     // These methods should all be abstract, but BR_CMemoryHookList instantiates a
  61.     // BR_CMemoryHook to use as the head of its linked list, so here we just use empty
  62.     // inlines. A BR_CMemoryHook still cannot be instantiated because the constructor
  63.     // is protected.
  64.  
  65.     virtual BR_MemoryBlockSize AboutToAllocate(BR_MemoryBlockSize size);
  66.     virtual void* DidAllocate(void* blk,
  67.                               BR_MemoryBlockSize);
  68.     virtual void* AboutToBlockSize(void* blk);
  69.     virtual void* AboutToFree(void* blk);
  70.     virtual void AboutToRealloc(void*& ,
  71.                                 BR_MemoryBlockSize&);
  72.     virtual void* DidRealloc(void* blk,
  73.                              BR_MemoryBlockSize);
  74.     virtual void AboutToReset();
  75.     virtual void Comment(const char*);
  76.  
  77.     virtual~ BR_CMemoryHook();
  78.  
  79. protected:
  80.     BR_CMemoryHook();
  81.  
  82. private:
  83.     BR_CMemoryHook* fNextHook, * fPreviousHook;
  84.  
  85.     friend BR_CMemoryHookList;
  86. };
  87.  
  88.  
  89.  
  90.  
  91. //========================================================================================
  92. // BR_CMemoryHookList
  93. //
  94. //        A list of fMemory hooks. This is a special linked list that assumes the links for
  95. //        the list are fields of BR_CMemoryHook. This avoids endless recursion were we to
  96. //        allocate nodes for the BR_CMemoryHooks here.
  97. //
  98. //========================================================================================
  99.  
  100. class BR_CMemoryHookList
  101. {
  102. public:
  103.     BR_CMemoryHookList();
  104.  
  105.     void Add(BR_CMemoryHook* aMemoryHook);
  106.     void Remove(BR_CMemoryHook* aMemoryHook);
  107.     BR_CMemoryHook* First();
  108.     BR_CMemoryHook* Next();
  109.     BR_CMemoryHook* Previous();
  110.     BR_CMemoryHook* Last();
  111.  
  112.     ~BR_CMemoryHookList();
  113.  
  114. private:
  115.     BR_CMemoryHook fHead;
  116.     BR_CMemoryHook* fCurrentHook;
  117. };
  118.  
  119.  
  120. //========================================================================================
  121. // BR_CMemoryHeap
  122. //
  123. //        Abstract base class for fMemory heaps.
  124. //
  125. //========================================================================================
  126.  
  127. class BR_CMemoryHeap
  128. {
  129. public:
  130.     static const char* kDefaultDescription;
  131.  
  132.     static BR_CMemoryHeap* fHeapList;
  133.     static BR_CMemoryHeap* GetFirstHeap();
  134.  
  135.     void* Allocate(BR_MemoryBlockSize size);
  136.     BR_MemoryBlockSize BlockSize(const void* block) const;
  137.     virtual BR_MemoryBlockSize BytesAllocated() const;
  138.     virtual BR_MemoryBlockSize BytesFree() const = 0;
  139.     virtual void Check() const = 0;
  140.     void Free(void*);
  141.     virtual BR_Boolean GetAutoValidation() const;
  142.     virtual char* GetDescription() const;
  143.     virtual BR_CMemoryHeap* GetNextHeap() const;
  144.     virtual BR_Boolean GetZapOnAllocate() const;
  145.     virtual BR_Boolean GetZapOnFree() const;
  146.     virtual BR_MemoryBlockSize HeapSize() const = 0;
  147.     virtual void InstallHook(BR_CMemoryHook* BR_CMemoryHook);
  148.     BR_Boolean IsValidBlock(void* blk) const;
  149.     virtual BR_Boolean IsMyBlock(void* blk) const = 0;
  150.     virtual BR_MemoryBlockSize NumberAllocatedBlocks() const;
  151.     virtual void Print(char* msg = "") const = 0;
  152.     void Reset();
  153.     void* Reallocate(void* block,
  154.                      BR_MemoryBlockSize newSize);
  155.     virtual void RemoveHook(BR_CMemoryHook* BR_CMemoryHook);
  156.     virtual void SetAutoValidation(BR_Boolean = FALSE);
  157.     virtual void SetDescription(const char* description = kDefaultDescription);
  158.     virtual void SetZapOnAllocate(BR_Boolean = FALSE);
  159.     virtual void SetZapOnFree(BR_Boolean = FALSE);
  160.  
  161.     void* operator new(size_t size);
  162.     void operator delete(void* ptr);
  163.  
  164.     virtual~ BR_CMemoryHeap();
  165.  
  166. protected:
  167.     BR_CMemoryHeap(BR_Boolean autoValidation = FALSE,
  168.                    BR_Boolean zapOnAllocate = TRUE,
  169.                    BR_Boolean zapOnFree = FALSE);
  170.  
  171.     virtual void* AllocateRawMemory(BR_MemoryBlockSize size);
  172.     virtual void* DoAllocate(BR_MemoryBlockSize size,
  173.                              BR_MemoryBlockSize& allocatedSize) = 0;
  174.     virtual BR_MemoryBlockSize DoBlockSize(const void* block) const = 0;
  175.     virtual void DoFree(void*) = 0;
  176.     virtual BR_Boolean DoIsValidBlock(void* blk) const = 0;
  177.     virtual void DoReset() = 0;
  178.     virtual void* DoReallocate(void* block,
  179.                                BR_MemoryBlockSize newSize,
  180.                                BR_MemoryBlockSize& allocatedSize);
  181.     virtual void FreeRawMemory(void* ptr);
  182.  
  183. private:
  184.     enum
  185.     {
  186.         kDescriptionLength = 32
  187.     };
  188.  
  189.  
  190.     char fDescription[kDescriptionLength];
  191.     BR_CMemoryHeap* fNextHeap;
  192.     BR_Boolean fZapOnAllocate;
  193.     BR_Boolean fZapOnFree;
  194.     BR_Boolean fAutoValidation;
  195.     BR_MemoryBlockSize fBytesAllocated;
  196.     BR_MemoryBlockSize fNumberAllocatedBlocks;
  197.     BR_CMemoryHookList fMemoryHookList;
  198.  
  199.     BR_MemoryBlockSize CallAboutToAllocateHooks(BR_MemoryBlockSize size);
  200.     void* CallDidAllocateHooks(void* blk,
  201.                                BR_MemoryBlockSize size);
  202.     void* CallAboutToBlockSizeHooks(void* blk);
  203.     void* CallAboutToFreeHooks(void* blk);
  204.     void CallAboutToReallocHooks(void*& blk,
  205.                                  BR_MemoryBlockSize& size);
  206.     void* CallDidReallocHooks(void* blk,
  207.                               BR_MemoryBlockSize size);
  208.     void CallAboutToResetHooks();
  209.     void CallCommentHooks(const char* comment);
  210.     void ValidateAndReport(void* blk) const;
  211. };
  212.  
  213.  
  214. #endif
  215.